package znyl.nursing.service.impl;


import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;

import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.springframework.stereotype.Service;
import znyl.nursing.service.WechatService;
import org.springframework.beans.factory.annotation.Value;
import java.util.HashMap;
import java.util.Map;
@Service
public class WechatServiceImpl implements WechatService {
    @Value("${wei.appId}")
    private String appId;

    @Value("${wei.appSecret}")
    private String appSecret;
    // 登录
    private static final String REQUEST_URL = "https://api.weixin.qq.com/sns/jscode2session?grant_type=authorization_code";


    // 获取token
    private static final String TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";

    // 获取手机号
    private static final String PHONE_REQUEST_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=";
    private Map<String, Object> getAppConfig(){
        Map<String, Object> map = new HashMap<>();
        map.put("appid", appId);
        map.put("secret", appSecret);
        return map;

    }

    /**
     * 获取openid
     *
     * @param code
     * @return
     */
    @Override
    public String getOpenid(String code) {
        Map<String, Object> appConfig = getAppConfig();
        appConfig.put("js_code", code);
        String result = HttpUtil.get(REQUEST_URL, appConfig);
        //返回的数据有多个字段，这里只返回openid
        //先将JSON准换成Map
       JSONObject map = JSONUtil.parseObj(result);
        //判段接口是否成功
        if (ObjectUtil.isNotEmpty(map.getInt("errcode"))) {
            throw new RuntimeException(map.getStr("errmsg")); //map.getStr("errmsg") 获取错误信息
        }
        return map.getStr("openid");
    }

    /**
     * 获取手机号
     *
     * @param detailCode
     * @return
     */
    @Override
    public String getPhone(String detailCode) {
        //微信小程序规定在获取手机号之前需要先获取access_token才行
        //获取token
        String token= getToken();
        String url = PHONE_REQUEST_URL + token;
        //我们手机号获取是需要三个参数，token（需要拼接在路劲后面），code（手机号获取接口的参数）,OpenId（不需要传）
//        由于是post请求需要封装到请求体重，所以这里需要转换成json格式
        Map<String, Object> map = new HashMap<>();
        map.put("code", detailCode);
        String result = HttpUtil.post(url, JSONUtil.toJsonStr(map));
        //返回的数据有多个字段，这里只返回手机号
        //先将JSON准换成Map
        //TODO:这里需要将返回的数据转换成对象，然后获取phone字段的值
        JSONObject map1 = JSONUtil.parseObj(result);
        //这里判断需要改变一下！需要map1.getInt("errcode")不等于0为错！不再是map1.getInt("errcode")为空是错的
        if (map1.getInt("errcode") != 0 ){
            throw new RuntimeException(map1.getStr("errmsg"));
        }
        //由于手机号返回的数据为多层次结构！我们需要将先外层的数据转换成对象，再获取phone字段的值
        return map1.getJSONObject("phone_info")//获取phone_info字段的值
                .getStr("purePhoneNumber");//获取purePhoneNumber字段的值

    }

    private String getToken() {
        Map<String, Object> appConfig = getAppConfig();
        String result = HttpUtil.get(TOKEN_URL, appConfig);
        JSONObject map = JSONUtil.parseObj(result);
        if (ObjectUtil.isNotEmpty(map.getInt("errcode"))) {
            throw new RuntimeException(map.getStr("errmsg")); //map.getStr("errmsg") 获取错误信息
        }
        return map.getStr("access_token");
    }
}
